import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '../stores/user'

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 从环境变量中获取API基础URL
  timeout: 10000, // 增加超时时间到10秒
  withCredentials: true, // 允许携带cookie
  headers: {
    Accept: 'application/json',
  },
})

// 测试连接功能
export const testConnection = async () => {
  try {
    // 使用轻量级端点测试连接
    await request.get('/genre/main', { timeout: 3000 })
    return true
  } catch (error) {
    if (error.response) {
      // 服务器响应了，说明服务正常（即使是404或500也算连接成功）
      return true
    }
    return false
  }
}

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 添加token到请求头
    try {
      // 优先使用userStore中的token
      const userStore = useUserStore()
      const token = userStore.token || localStorage.getItem('token')
      
      if (token) {
        config.headers['Authorization'] = `Bearer ${token}`
        console.log('已添加Authorization头到请求:', config.url)
      } else {
        console.log('请求未携带token:', config.url)
      }
    } catch (error) {
      console.error('添加token失败:', error)
    }
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 200状态码表示成功
    console.log('API响应:', response)
    return response.data
  },
  (error) => {
    const status = error.response?.status
    const errorCode = error.code
    
    // 401错误静默处理，触发认证事件
    if (status === 401) {
      localStorage.removeItem('token')
      localStorage.removeItem('userId')
      const userStore = useUserStore()
      if (userStore) {
        userStore.token = ''
        userStore.userInfo = null
        userStore.userId = ''
      }
      
      // 触发认证错误事件
      if (typeof window !== 'undefined') {
        window.dispatchEvent(new CustomEvent('api-error', {
          detail: { type: 'auth', code: 401, message: '登录状态已过期' }
        }))
      }
      return Promise.reject(error)
    }

    // 网络错误和连接错误，触发连接事件
    const silentErrors = ['ECONNREFUSED', 'ETIMEDOUT', 'NETWORK_ERROR']
    if (!status || silentErrors.includes(errorCode)) {
      if (typeof window !== 'undefined') {
        window.dispatchEvent(new CustomEvent('api-error', {
          detail: { type: 'connection', code: errorCode || 'NETWORK_ERROR', message: error.message || '无法连接到服务器' }
        }))
      }
      return Promise.reject(error)
    }

    // 其他服务器错误
    let message = '请求失败'
    switch (status) {
      case 400:
        message = '请求参数错误'
        break
      case 403:
        message = '权限不足'
        break
      case 404:
        // 404错误静默处理，可能是正常情况
        return Promise.reject(error)
      case 500:
        message = '服务器错误'
        break
      default:
        message = '未知错误'
        break
    }

    // 触发API错误事件
    if (typeof window !== 'undefined') {
      window.dispatchEvent(new CustomEvent('api-error', {
        detail: { type: 'server', code: status, message }
      }))
    }
    
    return Promise.reject(error)
  },
)

export default request
